Supplement 1. Systematic review

PRISMA flowchart

Donne moi les chiffres quand tu as fini, j’insèrerai

PRISMAstatement::prisma(found = 750,
       found_other = 123,
       no_dupes = 776, 
       screened = 776, 
       screen_exclusions = 13, 
       full_text = 763,
       full_text_exclusions = 17, 
       qualitative = 746, 
       quantitative = 319,
       width = 800, height = 1200)

N studies (adjustment discarded)

dat_out_agg %>%
    group_by(outcome_RDoC_agg) %>%
    summarise(n_exp = sum(n_exp_out),
              n_nexp = sum(n_nexp_out),
              nstudy1 = n(),
              n_study2 = length(unique(ID_prec)))
## # A tibble: 4 x 5
##   outcome_RDoC_agg                      n_exp n_nexp nstudy1 n_study2
##   <chr>                                 <dbl>  <dbl>   <int>    <int>
## 1 Mixed social processes                 6192   5843      87       87
## 2 Reception of facial communication      2785   3124      45       45
## 3 Reception of non-facial communication   539    732       9        9
## 4 Understanding mental states            2818   2650      60       60

N studies (adjustment splitted)

synth_n = dat_out %>%
    group_by(outcome_RDoC) %>%
    summarise(n_exp = sum(n_exp_out),
              n_nexp = sum(n_nexp_out),
              nstudy1 = n(),
              n_study2 = length(unique(ID_prec)))
synth_n
## # A tibble: 8 x 5
##   outcome_RDoC                                      n_exp n_nexp nstudy1 n_stu~1
##   <chr>                                             <dbl>  <dbl>   <int>   <int>
## 1 Mixed social processes (adjusted)                   277    306       8       8
## 2 Mixed social processes (non-adjusted)              6046   5685      82      82
## 3 Reception of facial communication (adjusted)       1064   1577       7       7
## 4 Reception of facial communication (non-adjusted)   1873   1703      41      41
## 5 Reception of non-facial communication (adjusted)    261    542       3       3
## 6 Reception of non-facial communication (non-adjus~   351    254       7       7
## 7 Understanding mental states (adjusted)              245    274       9       9
## 8 Understanding mental states (non-adjusted)         2712   2536      56      56
## # ... with abbreviated variable name 1: n_study2

Supplement 2. ES visualization

Distribution of ES

ggplot(dat.meta, aes(x = es_adj, y = es)) + 
  geom_jitter(alpha = 0.3, width = 0.35, size = 2) +
    geom_violin(size = 0.5, alpha = 0.5) +
theme_bw() 

Distribution of ES / outcomes

2 plots, tu choisis celui qui tu préfères

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
       geom_jitter(width = 0.05, dotsize = 0.1, alpha = 0.2, aes(fill = ID)) +        geom_boxplot(trim=FALSE, alpha = 0.6) +
      facet_grid(es_adj ~ "") +
       theme_bw() +
      labs(y = "Standardized mean difference (SMD)", x = "") +
        guides(fill=FALSE) +
       coord_flip()

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
    geom_violin(aes(fill = outcome_RDoC_agg), alpha = 0.3) +
  geom_jitter(alpha = 0.2, width = 0.1) +
    geom_boxplot(width=0.1)+
    facet_grid(es_adj ~ "") +
    theme_bw() +
    labs(y = "Standardized mean difference (SMD)", x = "") +
    theme(text = element_text(size = 18),
          legend.position = "none",
          axis.title.y = element_text(size=12, face="bold"), 
          axis.title.x = element_text(size=12, face="bold")) +
    coord_flip()  


Supplement 3. Main analysis

Data analysis

V.SCE  <- with(dat.meta,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1)
het = function(x, y) {
  i2 = NA
  for (i in 1:nrow(vcov(x))) {
    i2[i] = 100 * (vcov(x)[i,i] - vcov(y)[i,i]) / vcov(x)[i,i]
  }
  return(i2)
}
# 
# W <- solve(V.SCE)
# X <- model.matrix(SCE)
# P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
# 100 * SCE$tau2 / (SCE$tau2 + (SCE$k-SCE$p)/sum(diag(P)))


res.SCE <- data.frame(clubSandwich::coef_test(SCE, vcov = "CR2", cluster = dat.meta$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci = data.frame(clubSandwich::conf_int(SCE, vcov = "CR2", cluster = dat.meta$ID_study))
res.SCE$target <- gsub("outcome_RDoC", "", row.names(res.SCE))
res.SCE.ci$target <- gsub("outcome_RDoC", "", row.names(res.SCE.ci))
res.SCE = dplyr::left_join(res.SCE, res.SCE.ci)
res.SCE$I2 = het(SCE, SCE.ISQ)
res_main <- left_join(res.SCE, dat_RDoC)
## Joining, by = "target"
res_main[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_main[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_main$SE_COR = (res_main$CI_U - res_main$CI_L) / 3.92

res_main$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_main$outcome_RDoC))
tab.plot <- data.frame(
  Outcome = do.call(rbind, lapply(res_main$outcome_RDoC, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_main$n_exp_out,
  n_nexpT = res_main$n_nexp_out,
  n_studies = res_main$n_studies,
  I2 = paste0(round(res_main$I2), "%"))

value_num_plot = data.frame(apply(res_main[, c("beta", "SE_COR")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot[ ,c("beta", "SE_COR")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot,
           group = res_main$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot$n_ADHD + tab.plot$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

Diagnostics

# windows() ## create window to plot your file
# metafor::profile.rma.mv(SCE)
# dev.off()

Supplement 4. Supplementary analyses

S1. Borenstein aggregated approach

meta.reg <- metafor::rma.mv(yi = es, V = se^2, 
                           data = dat.borenstein, 
                           random = ~ outcome_RDoC | ID_study,
                           struct = "DIAG",
                           mods = ~ outcome_RDoC - 1)
meta.reg$beta = round(meta.reg$beta, 3)
meta.reg$se = round(meta.reg$se, 3)
meta.reg$pval = round(meta.reg$pval, 3)
res.S1.clean = data.frame(
  beta = meta.reg$beta,
  se = meta.reg$se,
  pval = meta.reg$pval, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)))

res.S1 <- left_join(res.S1.clean, dat_RDoC)
## Joining, by = "target"
DT::datatable(res.S1, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

S2. RVE approach

robu.main <- robumeta::robu(es ~ outcome_RDoC - 1, 
                            data = dat.meta, 
                            studynum = ID_study,
                            var.eff.size = se^2,
                            modelweights = "CORR",
                            small = TRUE,
                            rho = 0.8)
dat_robu_main = cbind(
  robu.main$reg_table$labels,
  round(robu.main$reg_table[,2:(ncol(robu.main$reg_table) -1)], 3))
DT::datatable(dat_robu_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

S3. Small study effects & ESS

Nakaraga method

dat.meta$inv_n_tilda <- with(dat.meta, (n_nexp + n_exp)/(n_nexp*n_exp))
dat.meta$sqrt_inv_n_tilda <- with(dat.meta, sqrt(inv_n_tilda))

nak.pb = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ 1 + sqrt_inv_n_tilda + outcome_RDoC,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(nak.pb, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt    0.131
## 2                                                 sqrt_inv_n_tilda    5.218
## 3                outcome_RDoCMixed social processes (non-adjusted)   -0.116
## 4         outcome_RDoCReception of facial communication (adjusted)   -0.712
## 5     outcome_RDoCReception of facial communication (non-adjusted)   -0.790
## 6     outcome_RDoCReception of non-facial communication (adjusted)   -0.688
## 7 outcome_RDoCReception of non-facial communication (non-adjusted)   -0.975
## 8               outcome_RDoCUnderstanding mental states (adjusted)   -0.851
## 9           outcome_RDoCUnderstanding mental states (non-adjusted)   -0.619
##      SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.530  0.247  8.94      0.81079     
## 2 1.919  2.719 17.93      0.01411    *
## 3 0.256 -0.451  8.45      0.66310     
## 4 0.309 -2.303 11.64      0.04056    *
## 5 0.264 -2.990  9.40      0.01449    *
## 6 0.372 -1.850  3.92      0.13935     
## 7 0.272 -3.591  9.60      0.00525   **
## 8 0.315 -2.701  9.78      0.02267    *
## 9 0.258 -2.400  9.51      0.03849    *

PET-PEESE method (Stanley 2014)

PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ se,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -2.89 0.454  -6.36 71.9       <0.001  ***
## 2      se    14.46 1.694   8.53 24.6       <0.001  ***
dat.meta$var = dat.meta$se^2
PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ var,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt   -0.854 0.187  -4.56 74.2       <0.001  ***
## 2     var   23.468 2.455   9.56 19.1       <0.001  ***

Split by outcome : Egger’s test + ESS

dat_ess = data.frame(
  meta_review = "Haza",
  study = dat.borenstein$ID_study,
  factor = dat.borenstein$outcome_RDoC,
  value = dat.borenstein$es,
  se = dat.borenstein$se,
  n_cases = dat.borenstein$n_exp,
  n_controls = dat.borenstein$n_nexp,
  measure = "G")
  
umb = metaumbrella::umbrella(dat_ess)
## Analyzing factor: Understanding mental states (non-adjusted) 
## Analyzing factor: Mixed social processes (non-adjusted) 
## Analyzing factor: Mixed social processes (adjusted) 
## Analyzing factor: Understanding mental states (adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (non-adjusted) 
## Analyzing factor: Reception of non-facial communication (non-adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (adjusted) 
## Analyzing factor: Reception of non-facial communication (adjusted)
umb
## 
## Umbrella review:
##                                                 Factor n_studies total_n
## 1           Understanding mental states (non-adjusted)        56    4917
## 2                Mixed social processes (non-adjusted)        82   10770
## 3                    Mixed social processes (adjusted)         8     583
## 4               Understanding mental states (adjusted)         9     519
## 5     Reception of facial communication (non-adjusted)        41    3168
## 6 Reception of non-facial communication (non-adjusted)         7     605
## 7         Reception of facial communication (adjusted)         7    1075
## 8     Reception of non-facial communication (adjusted)         3     497
##   n_cases n_controls measure value       value_CI    eG          eG_CI   eOR
## 1    2521       2396       G 0.835  [0.68, 0.989] 0.835  [0.68, 0.989] 4.544
## 2    5570       5200       G 1.055 [0.908, 1.201] 1.055 [0.908, 1.201] 6.773
## 3     277        306       G 1.257 [0.607, 1.908] 1.257 [0.607, 1.908] 9.782
## 4     245        274       G 0.879 [0.455, 1.304] 0.879 [0.455, 1.304] 4.928
## 5    1657       1511       G 0.789 [0.603, 0.974] 0.789 [0.603, 0.974] 4.181
## 6     351        254       G 0.968 [0.525, 1.411] 0.968 [0.525, 1.411] 5.784
## 7     425        650       G 0.557 [0.355, 0.759] 0.557 [0.355, 0.759] 2.747
## 8     171        326       G 0.590 [0.008, 1.172] 0.590 [0.008, 1.172] 2.917
##            eOR_CI  p_value     I2           PI_eG          PI_eOR  egger_p
## 1  [3.433, 6.015] 3.62e-26 84.410 [-0.239, 1.908] [0.648, 31.844] 6.18e-01
## 2  [5.194, 8.832] 2.70e-45 88.405  [-0.201, 2.31] [0.695, 66.008] 1.07e-04
## 3 [3.008, 31.817] 1.51e-04 91.236 [-1.084, 3.598] [0.14, 683.241] 2.73e-01
## 4 [2.283, 10.638] 4.87e-05 79.001 [-0.607, 2.366] [0.332, 73.049] 1.45e-01
## 5  [2.986, 5.852] 7.75e-17 86.138  [-0.333, 1.91] [0.547, 31.979] 4.46e-01
## 6   [2.59, 12.92] 1.86e-05 82.754  [-0.515, 2.45] [0.393, 85.127] 8.53e-01
## 7  [1.903, 3.965] 6.77e-08 55.000 [-0.024, 1.138]  [0.958, 7.875] 4.78e-01
## 8  [1.015, 8.385] 4.69e-02 77.993 [-6.381, 7.561] [0, 904222.896] 7.65e-01
##      ESB_p power_med     JK_p   largest_CI_eG  largest_CI_eOR rob amstar
## 1 9.90e-01       100 5.37e-25 [-0.304, 0.449]  [0.576, 2.258]  NA     NA
## 2 1.00e-01       100 6.07e-44 [-0.154, 0.883]  [0.757, 4.957]  NA     NA
## 3 6.73e-01       100 1.53e-03  [0.623, 1.315] [3.095, 10.864]  NA     NA
## 4 3.78e-01       100 3.44e-04  [0.271, 0.939]  [1.634, 5.494]  NA     NA
## 5 7.50e-01       100 8.10e-16  [1.259, 1.804] [9.805, 26.349]  NA     NA
## 6 3.58e-01       100 6.06e-04  [0.967, 1.419] [5.776, 13.118]  NA     NA
## 7 2.37e-01       100 6.53e-06   [0.218, 1.22]   [1.484, 9.15]  NA     NA
## 8 4.14e-01       100 2.32e-01  [0.165, 0.879]  [1.348, 4.928]  NA     NA
# metaumbrella::umbrella(subset(dat_ess, factor == "Mixed social processes (non-adjusted)"))[[1]]$egger$p.value
# metafor::regtest(x = dat_sub$es, sei = dat_sub$se, model = "lm", predictor="sei")$pval

Plot

ggplot(dat.borenstein, aes(x=es, y=se)) + 
    geom_point(alpha = 0.2) + 
    geom_smooth(method="lm") + 
    facet_wrap(~outcome_RDoC, scales='free') +
    theme_bw()
## `geom_smooth()` using formula 'y ~ x'

S4. type of publication

SCE.S2 <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ type_publication - 1 + outcome_RDoC,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S2, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                               Coef. Estimate
## 1                                           type_publicationArticle    1.464
## 2                                        type_publicationConférence    3.702
## 3                                            type_publicationPoster    1.117
## 4                                             type_publicationThèse    1.559
## 5                 outcome_RDoCMixed social processes (non-adjusted)   -0.293
## 6          outcome_RDoCReception of facial communication (adjusted)   -1.035
## 7      outcome_RDoCReception of facial communication (non-adjusted)   -0.826
## 8      outcome_RDoCReception of non-facial communication (adjusted)   -0.995
## 9  outcome_RDoCReception of non-facial communication (non-adjusted)   -1.119
## 10               outcome_RDoCUnderstanding mental states (adjusted)   -0.738
## 11           outcome_RDoCUnderstanding mental states (non-adjusted)   -0.634
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1  0.234   6.26  7.00      < 0.001  ***
## 2  0.243  15.23  8.21      < 0.001  ***
## 3  0.323   3.46  1.69      0.09369    .
## 4  0.262   5.95  9.69      < 0.001  ***
## 5  0.243  -1.21  8.21      0.26154     
## 6  0.238  -4.36  9.31      0.00169   **
## 7  0.246  -3.35  8.69      0.00890   **
## 8  0.383  -2.60  3.72      0.06438    .
## 9  0.270  -4.15 10.84      0.00168   **
## 10 0.267  -2.76  9.37      0.02117    *
## 11 0.242  -2.62  8.73      0.02860    *
ggplot(dat.borenstein, aes(x = type_publication, y = es)) + 
  geom_point(size = 3, alpha = 0.2) + 
  geom_boxplot() +
  theme_bw()

S5. Each facial emotion

Data analysis

dat.meta.S3 = subset(dat.meta, 
    emot_spec %in% c("Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger") & 
      grepl("Reception of facial", dat.meta$outcome_RDoC, fixed = TRUE) & 
      !grepl("(adjusted)", dat.meta$outcome_RDoC, fixed = TRUE))

V.SCE.S3  <- with(dat.meta.S3,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study,
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = emot_spec))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                       data = dat.meta.S3, 
                       mods = ~ emot_spec - 1,
                       random = ~ emot_spec | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ.S3 <- metafor::rma.mv(yi = es, V = V.SCE.S3, 
                               data = dat.meta.S3, 
                               mods = ~ emot_spec - 1)

res.SCE.S3 <- data.frame(clubSandwich::coef_test(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci.S3 = data.frame(clubSandwich::conf_int(SCE.S3, vcov = "CR2", cluster = dat.meta.S3$ID_study))
res.SCE.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.S3))
res.SCE.ci.S3$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.ci.S3))
res.SCE.S3 = dplyr::left_join(res.SCE.S3, res.SCE.ci.S3)
## Joining, by = c("beta", "SE", "df", "emot_spec")
res.SCE.S3$I2 = het(SCE.S3, SCE.ISQ.S3)
res.SCE.clean.S3 = subset(res.SCE.S3, SE > 0.000001)

Table

dat_emot$emot_spec = dat_emot$nom_sousdim_clean
res_S3 <- left_join(res.SCE.clean.S3, dat_emot)
## Joining, by = "emot_spec"
res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_S3[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_S3, 
              rownames = FALSE,
              options = list(  # options
                scrollX = TRUE,
                dom = c('ft'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_S3$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_S3$nom_sousdim_clean))
tab.plot.S3 <- data.frame(
  Outcome = do.call(rbind, lapply(res_S3$nom_sousdim_clean, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_S3$n_exp_out,
  n_nexpT = res_S3$n_nexp_out,
  n_studies = res_S3$n_studies,
  I2 = paste0(round(res_S3$I2), "%"))

value_num_plot_S3 = data.frame(apply(res_S3[, c("beta", "SE")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot_S3[ ,c("beta", "SE")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot.S3,
           group = res_S3$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot.S3$n_ADHD + tab.plot.S3$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

S6. Effect of age

a. Age

dat.meta.S6 = subset(dat.meta, !is.na(age) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.52443
## 2                                                              age -0.03171
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.74394
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.45353
## 5 age:outcome_RDoCReception of facial communication (non-adjusted)  0.01956
## 6       age:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00995
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 0.8755  1.7412 18.0       0.0987    .
## 2 0.0845 -0.3752 15.7       0.7125     
## 3 0.9613 -0.7739 33.3       0.4445     
## 4 1.2156 -0.3731 35.0       0.7113     
## 5 0.0929  0.2105 27.6       0.8349     
## 6 0.1162  0.0857 30.8       0.9323
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.2181, p-val = 0.8967
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.4214 0.3941
## 2                                                          age  -0.0217 0.0369
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5362 0.1059
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3516 0.1082
##   t-stat d.f. p-val (Satt) Sig.
## 1  3.607 45.0      < 0.001  ***
## 2 -0.587 34.0      0.56119     
## 3 -5.065 81.1      < 0.001  ***
## 4 -3.250 98.4      0.00158   **
ggplot(dat.meta.S6, aes(x = age, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Age diff

dat.meta.S6 = subset(dat.meta, !is.na(age_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                                   Coef.
## 1                                                               intrcpt
## 2                                                              age_diff
## 3          outcome_RDoCReception of facial communication (non-adjusted)
## 4                outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 age_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       age_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE  t-stat   d.f. p-val (Satt) Sig.
## 1   1.1959 0.0771 15.5164  79.18      < 0.001  ***
## 2  -0.0563 0.2283 -0.2466   3.46      0.81915     
## 3  -0.5456 0.1092 -4.9964  83.73      < 0.001  ***
## 4  -0.3597 0.1099 -3.2730 100.11      0.00146   **
## 5  -0.0180 0.2397 -0.0750   5.33      0.94296     
## 6   0.0039 0.2578  0.0151   5.35      0.98848
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.2205, p-val = 0.8956
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.1957 0.0746
## 2                                                     age_diff  -0.0586 0.0598
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5462 0.1072
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3595 0.1088
##   t-stat   d.f. p-val (Satt) Sig.
## 1 16.031  79.23      < 0.001  ***
## 2 -0.981   6.09      0.36404     
## 3 -5.094  84.06      < 0.001  ***
## 4 -3.304 100.07      0.00132   **
ggplot(dat.meta.S6, aes(x = age_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S7. Effect of comorbidities

CATEGORISATION ASD QUESTION ?? Pas de % intermediaire 0 100

a. ASD

dat.meta.S7_a = subset(dat.meta, !is.na(percentage_asd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S7_a$percentage_asd = as.numeric(as.character(dat.meta.S7_a$percentage_asd))
V.SCE.S7_a  <- with(dat.meta.S7_a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_a <- metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                          data = dat.meta.S7_a, 
                          mods = ~ percentage_asd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_a, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                         Coef.
## 1                                                                     intrcpt
## 2                                                              percentage_asd
## 3                outcome_RDoCReception of facial communication (non-adjusted)
## 4                      outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.33347 0.09607  13.88 45.40      < 0.001  ***
## 2  0.01059 0.00220   4.82  4.62      0.00588   **
## 3 -0.75666 0.13481  -5.61 49.57      < 0.001  ***
## 4 -0.53562 0.13918  -3.85 57.51      < 0.001  ***
## 5 -0.00979 0.00219  -4.48  2.62      0.02760    *
## 6 -0.00753 0.00250  -3.00  3.48      0.04747    *
anova(SCE.S7_a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 188.0998, p-val < .0001
SCE.S7_a_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                data = dat.meta.S7_a, 
                mods = ~ percentage_asd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
SCE.S7_a_ph
## 
## Multivariate Meta-Analysis Model (k = 372; method: REML)
## 
## Variance Components:
## 
## outer factor: ID_study     (nlvls = 76)
## inner factor: outcome_RDoC (nlvls = 3)
## 
##             estim    sqrt  k.lvl  fixed 
## tau^2.1    2.1893  1.4796    120     no 
## tau^2.2    0.5203  0.7213    125     no 
## tau^2.3    0.9296  0.9642    127     no 
##                                                       level 
## tau^2.1               Mixed social processes (non-adjusted) 
## tau^2.2    Reception of facial communication (non-adjusted) 
## tau^2.3          Understanding mental states (non-adjusted) 
## 
## Test for Residual Heterogeneity:
## QE(df = 369) = 8126.5346, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 489.9784, p-val < .0001
## 
## Model Results:
## 
##                                                                              estimate 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)               0.0107 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)    0.0008 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)          0.0031 
##                                                                                  se 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)             0.0005 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)  0.0006 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)        0.0005 
##                                                                                 zval 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)             21.2768 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)   1.3837 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)         5.9467 
##                                                                                pval 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)             <.0001 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)  0.1664 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)        <.0001 
##                                                                                ci.lb 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)              0.0097 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)  -0.0003 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)         0.0021 
##                                                                               ci.ub 
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)             0.0117 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)  0.0020 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)        0.0041 
##  
## percentage_asd:outcome_RDoCMixed social processes (non-adjusted)             *** 
## percentage_asd:outcome_RDoCReception of facial communication (non-adjusted) 
## percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)        *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
clubSandwich::coef_test(SCE.S7_a_ph, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                         Coef.
## 1            percentage_asd:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_asd:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_asd:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate       SE t-stat d.f. p-val (Satt) Sig.
## 1 0.010683 0.002227   4.80 4.54      0.00628   **
## 2 0.000823 0.000125   6.57 1.00      0.09617    .
## 3 0.003095 0.001718   1.80 1.23      0.28516
ggplot(dat.meta.S7_a, aes(x = percentage_asd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. ODD/CD

dat.meta.S7_b = subset(dat.meta, !is.na(percentage_cd_odd) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S7_b$percentage_cd_odd = as.numeric(as.character(dat.meta.S7_b$percentage_cd_odd))
V.SCE.S7_b  <- with(dat.meta.S7_b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_b <- metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                          data = dat.meta.S7_b, 
                          mods = ~ percentage_cd_odd * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_cd_odd
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.20300 0.12805   9.39 35.39      < 0.001  ***
## 2  0.00375 0.00249   1.51  1.20      0.34279     
## 3 -0.54263 0.16502  -3.29 51.05      0.00183   **
## 4 -0.34174 0.16583  -2.06 50.36      0.04452    *
## 5 -0.00386 0.00276  -1.40  1.80      0.30953     
## 6 -0.00464 0.00267  -1.74  1.68      0.24753
anova(SCE.S7_b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 19.7826, p-val < .0001
SCE.S7_b_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                data = dat.meta.S7_b, 
                mods = ~ percentage_cd_odd : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b_ph, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1            percentage_cd_odd:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_cd_odd:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_cd_odd:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate      SE   t-stat d.f. p-val (Satt) Sig.
## 1  4.14e-03 0.00197  2.10194 1.14        0.258     
## 2  1.21e-06 0.00120  0.00101 2.32        0.999     
## 3 -4.85e-04 0.00103 -0.47208 1.27        0.705
ggplot(dat.meta.S7_b, aes(x = percentage_cd_odd, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S8. Effect of sex

SEX VALUE SUP 100 et aucune val > 50

dat.meta.S8 = subset(dat.meta, !is.na(sex) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S8$sex = as.numeric(as.character(dat.meta.S8$sex))
dat.meta.S8$sex[dat.meta.S8$sex > 100] <- NA
V.SCE.S8  <- with(dat.meta.S8,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.35541
## 2                                                              sex -0.00549
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.78459
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.50682
## 5 sex:outcome_RDoCReception of facial communication (non-adjusted)  0.00740
## 6       sex:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00455
##        SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.18257  7.424 26.65       <0.001  ***
## 2 0.00615 -0.892  5.54       0.4093     
## 3 0.24874 -3.154 19.10       0.0052   **
## 4 0.23446 -2.162 28.07       0.0393    *
## 5 0.00894  0.827  9.22       0.4291     
## 6 0.00726  0.627 10.31       0.5441
anova(SCE.S8, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 3.0364, p-val = 0.2191
SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.29723 0.13632
## 2                                                          sex -0.00342 0.00431
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.58612 0.11386
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.38848 0.11226
##   t-stat d.f. p-val (Satt) Sig.
## 1  9.516 52.4       <0.001  ***
## 2 -0.792 10.8        0.445     
## 3 -5.148 67.7       <0.001  ***
## 4 -3.461 88.6       <0.001  ***
ggplot(dat.meta.S8, aes(x = sex, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S9. Effect of IQ

a. IQ

dat.meta.S9 = subset(dat.meta, !is.na(iq) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq = as.numeric(as.character(dat.meta.S9$iq))
# dat.meta.S9$iq[dat.meta.S9$iq > 100] <- NA
V.SCE.S9  <- with(dat.meta.S9,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                             Coef. Estimate
## 1                                                         intrcpt -0.74642
## 2                                                              iq  0.01922
## 3    outcome_RDoCReception of facial communication (non-adjusted)  2.00882
## 4          outcome_RDoCUnderstanding mental states (non-adjusted) -0.80518
## 5 iq:outcome_RDoCReception of facial communication (non-adjusted) -0.02587
## 6       iq:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00241
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 7.1476 -0.1044 5.69        0.920     
## 2 0.0687  0.2798 5.83        0.789     
## 3 7.4157  0.2709 8.09        0.793     
## 4 9.2147 -0.0874 5.40        0.934     
## 5 0.0712 -0.3633 8.11        0.726     
## 6 0.0884  0.0273 5.28        0.979
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.1427, p-val = 0.3425
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  -0.2318 3.9825
## 2                                                           iq   0.0143 0.0384
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.6720 0.1524
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5483 0.1375
##    t-stat  d.f. p-val (Satt) Sig.
## 1 -0.0582  9.70        0.955     
## 2  0.3720  9.74        0.718     
## 3 -4.4085 39.87       <0.001  ***
## 4 -3.9879 45.08       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. IQ diff

dat.meta.S9 = subset(dat.meta, !is.na(iq_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq_diff = as.numeric(as.character(dat.meta.S9$iq_diff))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt  1.34859
## 2                                                              iq_diff  0.01092
## 3         outcome_RDoCReception of facial communication (non-adjusted) -0.79133
## 4               outcome_RDoCUnderstanding mental states (non-adjusted) -0.53934
## 5 iq_diff:outcome_RDoCReception of facial communication (non-adjusted) -0.01468
## 6       iq_diff:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00258
##       SE  t-stat  d.f. p-val (Satt) Sig.
## 1 0.4013  3.3610 29.78      0.00214   **
## 2 0.0434  0.2517  5.44      0.81048     
## 3 0.4107 -1.9267 34.81      0.06221    .
## 4 0.4730 -1.1402 33.53      0.26227     
## 5 0.0461 -0.3181  3.31      0.76947     
## 6 0.0539  0.0479  5.86      0.96341
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.8787, p-val = 0.3909
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  1.33583 0.2554
## 2                                                      iq_diff  0.00947 0.0245
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.72121 0.1902
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.55448 0.1391
##   t-stat  d.f. p-val (Satt) Sig.
## 1  5.230 33.19       <0.001  ***
## 2  0.387  8.54        0.708     
## 3 -3.791 40.05       <0.001  ***
## 4 -3.987 44.95       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S10. Effect of rob

dat.meta.S10 = subset(dat.meta, !is.na(rob_tot) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S10  <- with(dat.meta.S10,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt   0.8150
## 2                                                              rob_tot   0.0662
## 3         outcome_RDoCReception of facial communication (non-adjusted)  -0.7567
## 4               outcome_RDoCUnderstanding mental states (non-adjusted)  -0.0864
## 5 rob_tot:outcome_RDoCReception of facial communication (non-adjusted)   0.0276
## 6       rob_tot:outcome_RDoCUnderstanding mental states (non-adjusted)  -0.0492
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.1391  5.860  5.04       0.0020   **
## 2 0.0213  3.103  3.86       0.0379    *
## 3 0.3677 -2.058 20.74       0.0524    .
## 4 0.2655 -0.325  4.79       0.7586     
## 5 0.0621  0.445 18.89       0.6614     
## 6 0.0409 -1.203  3.95       0.2961
anova(SCE.S10, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.7792, p-val = 0.4108
SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   0.8868 0.1160
## 2                                                      rob_tot   0.0539 0.0164
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5780 0.1022
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.3918 0.1076
##   t-stat  d.f. p-val (Satt) Sig.
## 1   7.65  8.56       <0.001  ***
## 2   3.28  5.20       0.0207    *
## 3  -5.66 83.92       <0.001  ***
## 4  -3.64 96.22       <0.001  ***
ggplot(dat.meta.S10, aes(x = rob_tot, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()